{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# pomegranate and parallelization\n",
    "\n",
    "pomegranate supports parallelization through a set of built in functions based off of joblib. All computationally intensive functions in pomegranate are implemented in cython with the global interpreter lock (GIL) released, allowing for multithreading to be used for efficient parallel processing. The following functions can be called for parallelization:\n",
    "\n",
    "1. fit\n",
    "2. summarize\n",
    "3. predict\n",
    "4. predict_proba\n",
    "5. predict_log_proba\n",
    "6. log_probability\n",
    "7. probability\n",
    "\n",
    "These functions can all be simply parallelized by passing in `n_jobs=X` to the method calls. This tutorial will demonstrate how to use those calls. First we'll look at a simple multivariate Gaussian mixture model, and compare its performance to sklearn. Then we'll look at a hidden Markov model with Gaussian emissions, and lastly we'll look at a mixture of Gaussian HMMs. These can all utilize the build-in parallelization that pomegranate has.\n",
    "\n",
    "Let's dive right in!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    }
   ],
   "source": [
    "%pylab inline\n",
    "from sklearn.mixture import GaussianMixture\n",
    "from pomegranate import *\n",
    "import seaborn, time\n",
    "seaborn.set_style('whitegrid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_dataset(n_samples, n_dim, n_classes, alpha=1):\n",
    "    \"\"\"Create a random dataset with n_samples in each class.\"\"\"\n",
    "    \n",
    "    X = numpy.concatenate([numpy.random.normal(i*alpha, 1, size=(n_samples, n_dim)) for i in range(n_classes)])\n",
    "    y = numpy.concatenate([numpy.zeros(n_samples) + i for i in range(n_classes)])\n",
    "    idx = numpy.arange(X.shape[0])\n",
    "    numpy.random.shuffle(idx)\n",
    "    return X[idx], y[idx]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. General Mixture Models\n",
    "\n",
    "pomegranate has a very efficient implementation of mixture models, particularly Gaussian mixture models. Lets take a look at how fast pomegranate is versus sklearn, and then see how much faster parallelization can get it to be."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn GMM\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/jmschr/anaconda2/lib/python2.7/site-packages/sklearn/mixture/base.py:237: ConvergenceWarning: Initialization 1 did not converge. Try different init parameters, or increase max_iter, tol or check for degenerate data.\n",
      "  % (init + 1), ConvergenceWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 loop, best of 3: 37 s per loop\n",
      "\n",
      "pomegranate GMM\n",
      "1 loop, best of 3: 23.6 s per loop\n",
      "\n",
      "pomegranate GMM (4 jobs)\n",
      "1 loop, best of 3: 10.6 s per loop\n"
     ]
    }
   ],
   "source": [
    "n, d, k = 1000000, 5, 3\n",
    "X, y = create_dataset(n, d, k)\n",
    "\n",
    "print \"sklearn GMM\"\n",
    "%timeit GaussianMixture(n_components=k, covariance_type='full', max_iter=15, tol=1e-10).fit(X)\n",
    "print \n",
    "print \"pomegranate GMM\"\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, max_iterations=15, stop_threshold=1e-10)\n",
    "print\n",
    "print \"pomegranate GMM (4 jobs)\"\n",
    "%timeit GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, n_jobs=4, max_iterations=15, stop_threshold=1e-10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like on a large dataset not only is pomegranate faster than sklearn at performing 15 iterations of EM on 3 million 5 dimensional datapoints with 3 clusters, but the parallelization is able to help in speeding things up. \n",
    "\n",
    "Lets now take a look at the time it takes to make predictions using GMMs. Lets fit the model to a small amount of data, and then predict a larger amount of data drawn from the same underlying distributions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "d, k = 25, 2\n",
    "X, y = create_dataset(1000, d, k)\n",
    "a = GaussianMixture(k, n_init=1, max_iter=25).fit(X)\n",
    "b = GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, max_iterations=25)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sklearn GMM\n",
      "1 loop, best of 3: 2.12 s per loop\n",
      "\n",
      "pomegranate GMM\n",
      "1 loop, best of 3: 1.68 s per loop\n",
      "\n",
      "pomegranate GMM (4 jobs)\n",
      "1 loop, best of 3: 1.59 s per loop\n"
     ]
    }
   ],
   "source": [
    "del X, y\n",
    "n = 1000000\n",
    "X, y = create_dataset(n, d, k)\n",
    "\n",
    "print \"sklearn GMM\"\n",
    "%timeit -n 1 a.predict_proba(X)\n",
    "print\n",
    "print \"pomegranate GMM\"\n",
    "%timeit -n 1 b.predict_proba(X)\n",
    "print\n",
    "print \"pomegranate GMM (4 jobs)\"\n",
    "%timeit -n 1 b.predict_proba(X, n_jobs=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like pomegranate can be slightly slower than sklearn when using a single processor, but that it can be parallelized to get faster performance. At the same time, predictions at this level happen so quickly (millions per second) that this may not be the most reliable test for parallelization.\n",
    "\n",
    "To ensure that we're getting the exact same results just faster, lets subtract the predictions from each other and make sure that the sum is equal to 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n"
     ]
    }
   ],
   "source": [
    "print (b.predict_proba(X) - b.predict_proba(X, n_jobs=4)).sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great, no difference between the two.\n",
    "\n",
    "Lets now make sure that pomegranate and sklearn are learning basically the same thing. Lets fit both models to some 2 dimensional 2 component data and make sure that they both extract the underlying clusters by plotting them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x7f4e62e02210>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f4e64e5be50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "d, k = 2, 2\n",
    "X, y = create_dataset(1000, d, k, alpha=2)\n",
    "a = GaussianMixture(k, n_init=1, max_iter=25).fit(X)\n",
    "b = GeneralMixtureModel.from_samples(MultivariateGaussianDistribution, k, X, max_iterations=25)\n",
    "\n",
    "y1, y2 = a.predict(X), b.predict(X)\n",
    "\n",
    "plt.figure(figsize=(16,6))\n",
    "plt.subplot(121)\n",
    "plt.title(\"sklearn clusters\", fontsize=14)\n",
    "plt.scatter(X[y1==0, 0], X[y1==0, 1], color='m', edgecolor='m')\n",
    "plt.scatter(X[y1==1, 0], X[y1==1, 1], color='c', edgecolor='c')\n",
    "\n",
    "plt.subplot(122)\n",
    "plt.title(\"pomegranate clusters\", fontsize=14)\n",
    "plt.scatter(X[y2==0, 0], X[y2==0, 1], color='m', edgecolor='m')\n",
    "plt.scatter(X[y2==1, 0], X[y2==1, 1], color='c', edgecolor='c')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It looks like we're getting the same basic results for the two. The two algorithms are initialized a bit differently, and so it can be difficult to directly compare the results between them, but it looks like they're getting roughly the same results."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Multivariate Gaussian HMM\n",
    "\n",
    "Now let's move on to training a hidden Markov model with multivariate Gaussian emissions with a diagonal covariance matrix. We'll randomly generate some Gaussian distributed numbers and use pomegranate with either one or four threads to fit our model to the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate Gaussian HMM (1 job)\n",
      "1 loop, best of 1: 22.1 s per loop\n",
      "\n",
      "pomegranate Gaussian HMM (2 jobs)\n",
      "1 loop, best of 1: 12.9 s per loop\n",
      "\n",
      "pomegranate Gaussian HMM (2 jobs)\n",
      "1 loop, best of 1: 8.37 s per loop\n"
     ]
    }
   ],
   "source": [
    "X = numpy.random.randn(1000, 500, 50)\n",
    "\n",
    "print \"pomegranate Gaussian HMM (1 job)\"\n",
    "%timeit -n 1 -r 1 HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=5)\n",
    "print\n",
    "print \"pomegranate Gaussian HMM (2 jobs)\"\n",
    "%timeit -n 1 -r 1 HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=5, n_jobs=2)\n",
    "print\n",
    "print \"pomegranate Gaussian HMM (2 jobs)\"\n",
    "%timeit -n 1 -r 1 HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=5, n_jobs=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All we had to do was pass in the n_jobs parameter to the fit function in order to get a speed improvement. It looks like we're getting a really good speed improvement, as well! This is mostly because the HMM algorithms perform a lot more operations than the other models, and so spend the vast majority of time with the GIL released. You may not notice as strong speedups when using a MultivariateGaussianDistribution because BLAS uses multithreaded operations already internally, even when only one job is specified.\n",
    "\n",
    "Now lets look at the prediction function to make sure the we're getting speedups there as well. You'll have to use a wrapper function to parallelize the predictions for a HMM because it returns an annotated sequence rather than a single value like a classic machine learning model might."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate Gaussian HMM (1 job)\n",
      "1 loop, best of 3: 3.22 s per loop\n",
      "\n",
      "pomegranate Gaussian HMM (2 jobs)\n",
      "1 loop, best of 3: 1.93 s per loop\n"
     ]
    }
   ],
   "source": [
    "model = HiddenMarkovModel.from_samples(NormalDistribution, 5, X, max_iterations=2, verbose=False)\n",
    "\n",
    "print \"pomegranate Gaussian HMM (1 job)\"\n",
    "%timeit predict_proba(model, X)\n",
    "print\n",
    "print \"pomegranate Gaussian HMM (2 jobs)\"\n",
    "%timeit predict_proba(model, X, n_jobs=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Great, we're getting a really good speedup on that as well! Looks like the parallel processing is more efficient with a bigger, more complex model, than with a simple one. This can make sense, because all inference/training is more complex, and so there is more time with the GIL released compared to with the simpler operations."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. Mixture of Hidden Markov Models\n",
    "\n",
    "Let's stack another layer onto this model by making it a mixture of these hidden Markov models, instead of a single one. At this point we're sticking a multivariate Gaussian HMM into a mixture and we're going to train this big thing in parallel."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def create_model(mus):\n",
    "    n = mus.shape[0]\n",
    "    \n",
    "    starts = numpy.zeros(n)\n",
    "    starts[0] = 1.\n",
    "    \n",
    "    ends = numpy.zeros(n)\n",
    "    ends[-1] = 0.5\n",
    "    \n",
    "    transition_matrix = numpy.zeros((n, n))\n",
    "    distributions = []\n",
    "    \n",
    "    for i in range(n):\n",
    "        transition_matrix[i, i] = 0.5\n",
    "        \n",
    "        if i < n - 1:\n",
    "            transition_matrix[i, i+1] = 0.5\n",
    "    \n",
    "        distribution = IndependentComponentsDistribution([NormalDistribution(mu, 1) for mu in mus[i]])\n",
    "        distributions.append(distribution)\n",
    "    \n",
    "    model = HiddenMarkovModel.from_matrix(transition_matrix, distributions, starts, ends)\n",
    "    return model\n",
    "    \n",
    "\n",
    "def create_mixture(mus):\n",
    "    hmms = [create_model(mu) for mu in mus]\n",
    "    return GeneralMixtureModel(hmms)\n",
    "\n",
    "n, d = 50, 10\n",
    "mus = [(numpy.random.randn(d, n)*0.2 + numpy.random.randn(n)*2).T for i in range(2)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate Mixture of Gaussian HMMs (1 job)\n",
      "1 loop, best of 3: 3 s per loop\n",
      "\n",
      "pomegranate Mixture of Gaussian HMMs (2 jobs)\n",
      "1 loop, best of 3: 1.83 s per loop\n"
     ]
    }
   ],
   "source": [
    "model = create_mixture(mus)\n",
    "X = numpy.random.randn(400, 150, d)\n",
    "\n",
    "print \"pomegranate Mixture of Gaussian HMMs (1 job)\"\n",
    "%timeit model.fit(X, max_iterations=5)\n",
    "print\n",
    "\n",
    "model = create_mixture(mus)\n",
    "print \"pomegranate Mixture of Gaussian HMMs (2 jobs)\"\n",
    "%timeit model.fit(X, max_iterations=5, n_jobs=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Looks like we're getting a really nice speed improvement when training this complex model. Let's take a look now at the time it takes to do inference with it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "pomegranate Mixture of Gaussian HMMs (1 job)\n",
      "1 loop, best of 3: 598 ms per loop\n",
      "\n",
      "pomegranate Mixture of Gaussian HMMs (2 jobs)\n",
      "1 loop, best of 3: 411 ms per loop\n"
     ]
    }
   ],
   "source": [
    "model = create_mixture(mus)\n",
    "\n",
    "print \"pomegranate Mixture of Gaussian HMMs (1 job)\"\n",
    "%timeit model.predict_proba(X)\n",
    "print\n",
    "\n",
    "model = create_mixture(mus)\n",
    "print \"pomegranate Mixture of Gaussian HMMs (2 jobs)\"\n",
    "%timeit model.predict_proba(X, n_jobs=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We're getting a good speed improvement here too through parallelization."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusions\n",
    "\n",
    "Hopefully you'll find pomegranate useful in your work! Parallelization should allow you to train complex models faster than before. Keep in mind though that there is an overhead to using parallel processing, and so it's possible that on some smaller examples it does not work as well. In general, the bigger the dataset, the closer to a linear speedup you'll get with pomegranate.\n",
    "\n",
    "If you have any interesting examples of how you've used pomegranate in your work, I'd love to hear about them. In addition I'd like to hear any feedback you may have on features you'd like to see. Please shoot me an email. Good luck!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
